{
  class Stack<T> {
    dataStore: T[] = [];
    top: number = 0;
    /**
     * 这里之所以要使用 getter 其实是为了语义
     *  这个实际上是一个计算属性
     *  我们当然也可以使用 length() 方法来进行操作，但是就与显示情况不相符
     *  length 明显是一个属性 如果是 getLength那么还有可能是一个方法，
     *  所以这里就是一个  getter 和 setter的一个比较不错的使用场景
     */
    get length(): Number {
      return this.dataStore.length;
    }
    constructor() {}
    // 入栈方法
    push(element: T): void {
      this.dataStore.push(element);
      this.top++;
    }
    // 出栈方法
    pop(): T | undefined {
      // 数组的pop()方法就是删除数组的最后一个元素
      if (this.dataStore.length !== 0) {
        this.top--;
        // console.log("2222");
        return this.dataStore.pop();
      }
    }
    // 返回栈顶元素
    peek(): T {
      // console.log(111, this.dataStore, this.top);
      return this.dataStore[this.top - 1];
    }
    // 清空栈
    clear(): void {
      this.top = 0;
      this.dataStore.length = 0;
    }
  }

  // 基本测试代码
  let user = new Stack<String>();
  user.push("Jimmy");
  user.push("xuexue");
  user.push("Jack");
  console.log("peek", user.peek());
  console.log("pop", user.pop());
  console.log("clear", user.clear());
  console.log("peek", user.peek());
  user.push("红宝书");
  console.log("peek", user.peek());
  console.log(user.length);

  // 进制转换
  const mulBase = (num: number, base: number) => {
    let s = new Stack();
    do {
      s.push(num % base);
      num = Math.floor((num /= base));
    } while (num > 0);
    let cinverted = "";
    while (s.length > 0) {
      cinverted += s.pop();
    }
    return cinverted;
  };
  var newNum = mulBase(32, 2);
  console.log(newNum);

  // 是否回文字符串
  const isPalindrome = (word: string) => {
    let s = new Stack();
    for (let i = 0; i < word.length; i++) {
      s.push(word[i]);
    }
    let rword = "";
    while (s.length > 0) {
      rword += s.pop();
    }
    return word === rword;
  };
  console.log(isPalindrome("hello"));
  console.log(isPalindrome("racecar"));
}
